package com.xuetang.mapper;

import com.xuetang.entity.BloodSugarRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 血糖记录Mapper接口
 */
@Mapper
public interface BloodSugarRecordMapper {

        /**
         * 根据用户ID和日期查询血糖记录
         * 
         * @param userId 用户ID
         * @param date   日期
         * @return 血糖记录列表
         */
        List<BloodSugarRecord> selectByUserIdAndDate(@Param("userId") Long userId, @Param("date") LocalDate date);

        /**
         * 根据用户ID和日期范围查询血糖记录
         * 
         * @param userId    用户ID
         * @param startDate 开始日期
         * @param endDate   结束日期
         * @return 血糖记录列表
         */
        List<BloodSugarRecord> selectByUserIdAndDateRange(
                        @Param("userId") Long userId,
                        @Param("startDate") LocalDate startDate,
                        @Param("endDate") LocalDate endDate);

        /**
         * 分页查询用户的血糖记录
         * 
         * @param userId 用户ID
         * @param type   测量类型，可为null
         * @param offset 偏移量
         * @param limit  限制数量
         * @return 血糖记录列表
         */
        List<BloodSugarRecord> selectPageByUserId(
                        @Param("userId") Long userId,
                        @Param("type") Integer type,
                        @Param("offset") int offset,
                        @Param("limit") int limit);

        /**
         * 查询用户血糖记录总数
         * 
         * @param userId 用户ID
         * @param type   测量类型，可为null
         * @return 记录总数
         */
        int countByUserId(
                        @Param("userId") Long userId,
                        @Param("type") Integer type);

        /**
         * 查询用户血糖统计数据
         * 
         * @param userId    用户ID
         * @param startDate 开始日期
         * @param endDate   结束日期
         * @return 统计结果
         */
        Map<String, Object> selectStatistics(
                        @Param("userId") Long userId,
                        @Param("startDate") LocalDate startDate,
                        @Param("endDate") LocalDate endDate);

        /**
         * 查询用户按日期分组的血糖值趋势
         * 
         * @param userId    用户ID
         * @param startDate 开始日期
         * @param endDate   结束日期
         * @return 日期和平均血糖值列表
         */
        List<Map<String, Object>> selectTrend(
                        @Param("userId") Long userId,
                        @Param("startDate") LocalDate startDate,
                        @Param("endDate") LocalDate endDate);

        /**
         * 查询用户按测量类型分组的血糖记录
         * 
         * @param userId    用户ID
         * @param startDate 开始日期
         * @param endDate   结束日期
         * @return 测量类型统计数据
         */
        List<Map<String, Object>> selectByMeasureType(
                        @Param("userId") Long userId,
                        @Param("startDate") LocalDate startDate,
                        @Param("endDate") LocalDate endDate);

        /**
         * 管理员查询所有血糖记录（分页）
         * 
         * @param userId    用户ID，可为null
         * @param startDate 开始日期，可为null
         * @param endDate   结束日期，可为null
         * @param offset    偏移量
         * @param limit     限制数量
         * @return 血糖记录列表（带用户信息）
         */
        List<BloodSugarRecord> selectPageForAdmin(
                        @Param("userId") Long userId,
                        @Param("startDate") LocalDate startDate,
                        @Param("endDate") LocalDate endDate,
                        @Param("offset") int offset,
                        @Param("limit") int limit);

        /**
         * 管理员查询血糖记录总数
         * 
         * @param userId    用户ID，可为null
         * @param startDate 开始日期，可为null
         * @param endDate   结束日期，可为null
         * @return 记录总数
         */
        int countForAdmin(
                        @Param("userId") Long userId,
                        @Param("startDate") LocalDate startDate,
                        @Param("endDate") LocalDate endDate);

        /**
         * 插入血糖记录
         * 
         * @param record 血糖记录
         * @return 影响行数
         */
        int insert(BloodSugarRecord record);

        /**
         * 更新血糖记录
         * 
         * @param record 血糖记录
         * @return 影响行数
         */
        int updateById(BloodSugarRecord record);

        /**
         * 根据ID删除血糖记录
         * 
         * @param id     记录ID
         * @param userId 用户ID
         * @return 影响行数
         */
        int deleteById(@Param("id") Long id, @Param("userId") Long userId);

        /**
         * 根据ID查询血糖记录
         * 
         * @param id 记录ID
         * @return 血糖记录
         */
        BloodSugarRecord selectById(@Param("id") Long id);
}